﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Sinacor.Infra.UI.Authorization;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter.IdentificacaoArquivo
{
    public class Negocio : IdentificacaoBase
    {
        private string _header;
        private string _tipoArquivo;
        private Model.Enum.TipoFormatoArquivo _tipoFormatoArquivo;
        private XmlDocument _xmlDoc;

        public Negocio(Model.Enum.TipoSistema tipoSistema)
            : base(tipoSistema)
        {
        }

        public override Model.Enum.TipoArquivo TipoArquivo
        {
            get
            {
                if (_tipoArquivo == "NEGR")
                {
                    return Model.Enum.TipoArquivo.NEGR;
                }
                else
                {
                    return Model.Enum.TipoArquivo.NEGS;
                }
            }
        }

        public override bool IdentificarArquivoTXT(string arquivo)
        {
            bool retorno = false;
            System.IO.StringReader reader = new System.IO.StringReader(arquivo);
            _header = reader.ReadLine();

            if (!String.IsNullOrEmpty(_header) &&
                _header.Length >= 6)
            {
                _tipoArquivo = _header.Substring(2, 4);

                _tipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.TXT;

                retorno = (_tipoArquivo == "NEGR"
                           || _tipoArquivo == "NEGS");

            }

            reader.Close();
            reader.Dispose();

            return retorno;
        }

        public override bool IdentificarArquivoXML(XmlDocument xmlDoc)
        {
            string tipoArquivo;
            bool retorno = false;

            if (xmlDoc["identificador"] != null
               && xmlDoc["identificador"].Attributes["arquivo"] != null)
            {
                tipoArquivo = xmlDoc["identificador"].Attributes["arquivo"].Value;

                _tipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.XML;

                if (tipoArquivo == "NEGR"
                    || tipoArquivo == "NEGS")
                {
                    _xmlDoc = xmlDoc;
                    retorno = true;
                }
            }

            return retorno;
        }

        public override bool IdentificarDataPregao(out DateTime dataPregao)
        {
            bool retorno = false;
            dataPregao = default(DateTime);

            if (_tipoFormatoArquivo == Model.Enum.TipoFormatoArquivo.TXT)
            {
                DateTime.TryParseExact(_header.Substring(30, 8), "yyyyMMdd", new System.Globalization.DateTimeFormatInfo(), System.Globalization.DateTimeStyles.None, out dataPregao);
            }
            else
            {
                DateTime.TryParse(_xmlDoc["identificador"]["evento"].Attributes["pregao"].Value, out dataPregao);
            }

            retorno = (dataPregao != default(DateTime));

            return retorno;
        }

        public override bool VerificarPermissaoAcesso()
        {
            string funcao;
            string modulo;

            if (TipoSistema == Model.Enum.TipoSistema.Bolsa)
            {
                modulo = "BOL";
                funcao = (_tipoArquivo == "NEGR") ? "BIMNEG" : "BNEGS";
            }
            else
            {
                modulo = "ORD";
                funcao = (_tipoArquivo == "NEGR") ? "NEGO" : "NEGS";
            }

            return AuthorizationManager.GetInstance().CheckUserAccess(modulo, funcao);
        }
    }
}
